// Package Builder provides ...
package Builder

/**
- [创建型_建造者模式](http://c.biancheng.net/view/1354.html)
- 将产品的构造行为与实现分离(与具体构造者绑定)，不同的构造者可以构造不同的产品。指将一个复杂对象的构造与它的表示分离，使同样的构建过程可以创建不同的表示，这样的设计模式被称为建造者模式
	1. 产品角色（Product）：它是包含多个组成部件的复杂对象，由具体建造者来创建其各个零部件。
	2. 抽象建造者（Builder）：它是一个包含创建产品各个子部件的抽象方法的接口，通常还包含一个返回复杂产品的方法 getResult()。
	3. 具体建造者(Concrete Builder）：实现 Builder 接口，完成复杂产品的各个部件的具体创建方法。
	4. 指挥者（Director）：它调用建造者对象中的部件构造与装配方法完成复杂对象的创建，在指挥者中不涉及具体产品的信息。

*/

type Builder interface {
	Build()
	//GetResult()
}

func NewBuilder(b Builder) Director {
	return Director{builder: b}
}

type Director struct {
	builder Builder
}

func NewDirector(b Builder) Director {
	return Director{builder: b}
}

// 指挥官(director)调用此方法和，具体构造者(ConcreteBuilder)开始构造产品(Product)
func (d *Director) Construct() {
	d.builder.Build()
}



// 具体builder，有自己的build 套路(Build())，最终会返回构建的产品(GetResult())
type ConcreteBuilder struct {
	built bool
}

func NewConcreteBuilder() ConcreteBuilder {
	return ConcreteBuilder{built: false}
}

func (b *ConcreteBuilder) Build() {
	b.built = true
}

type Product struct {
	Built bool
}

func (b *ConcreteBuilder) GetResult() Product {
	return Product{b.built}
}
